/*
 * app.c
 *
 */
#include "app.h"
#include "gpio.h"
#include "can.h"
#include "uart.h"
#include "display.h"

/**
 * globals
 *
 */
// 在STM32微控制器中，一个bool类型通常占用1个字节（8位）的内存空间。
bool coil[32];
bool discreteInput[32];
uint16_t holdingRegister[32];
/**
 * 0 AI0
 * 1 AI1
 * 2 电压VCC
 * 3 温度
 * 1 VDD
 * 2
 * 3 保留
 * 4 串口1空闲时间
 * 5 串口2空闲时间
 * 6 串口3空闲时间
 * 7
 */
uint16_t inputRegister[32];
const uint16_t file[512] __attribute__((section(".user"))) = { 40001, 2, 3, 4 };

/**
 * task1ms
 *
 */
void task1ms(void) {
	// 通讯定时任务
	uartTask1ms();
	// 显示定时任务
	displayTask1ms();
}

/**
 * task100ms
 *
 */
void task100ms(void) {

}

/**
 * task500ms
 *
 */
void task500ms(void) {

}

/**
 * task1s
 *
 */
void task1s(void) {
	static GPIO_PinState ledState = GPIO_PIN_RESET;
	ledState = !ledState;
	// RUN LED
	LED_RUN(ledState);
}

/**
 * timeTask
 *
 */
void timeTask(void) {
	// 系统时基
	static uint32_t lastTick = 0;
	int32_t delta = tickDelta(&lastTick);
	// 1ms
	if (delta > 0) {
		task1ms();
	}
	// 100ms
	static uint16_t ms100;
	ms100 += delta;
	if (ms100 >= 100) {
		ms100 = 0;
		task100ms();
	}
	// 500ms
	static uint16_t ms500;
	ms500 += delta;
	if (ms500 >= 500) {
		ms500 = 0;
		task500ms();
	}
	// 1s
	static uint16_t ms1k;
	ms1k += delta;
	if (ms1k >= 1000) {
		ms1k = 0;
		task1s();
	}
}

/**
 * setup
 *
 */
void setup(void) {

	gpioSetup();
	canSetup();
	uartSetup();
	displaySetup();
}

/**
 * loop
 *
 */
void loop(void) {
	//
	inputRegister[31] = VERSION;
	timeTask();

	gpioLoop();
	canLoop();
	uartLoop();
	displayLoop();
}
